import axios from "axios";
import {
  checkTokenExpirationStatus,
  clearTokenInfo,
  refreshAndGetNewAccessToken,
  createAuthHeader,
} from "@/utils/auth";
import { ElMessage } from "element-plus";

// 创建 axios 实例并配置基础路径
const instance = axios.create({
  baseURL: "http://8.138.211.226:8111/api",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded",
  },
});

// 请求拦截器
instance.interceptors.request.use(
  async (config) => {
    // 检查是否需要携带 Token（排除登录相关接口）
    const isAuthRequired =
      !config.url?.includes("/user/qr") &&
      !config.url?.includes("/user/login") &&
      !config.url?.includes("/user/refresh");

    if (isAuthRequired) {
      const accessToken = localStorage.getItem("accessToken");

      // 检查accessToken是否需要刷新
      if (accessToken && checkTokenExpirationStatus("access")) {
        try {
          // 尝试刷新Token
          await refreshAndGetNewAccessToken();
        } catch (error) {
          // 刷新失败：清除Token并跳转到登录页
          clearTokenInfo();
          ElMessage.error("登录已过期，请重新登录");

          // 直接跳转登录页，不发送后续请求
          setTimeout(() => {
            window.location.href = "/login";
          }, 1000);

          // 返回被拒绝的Promise，阻断原请求
          return Promise.reject(new Error("Token刷新失败，已退出登录"));
        }
      }

      // 统一使用createAuthHeader创建请求头（自动获取最新token）
      const authHeader = createAuthHeader(config.headers["Content-Type"]);
      config.headers = { ...config.headers, ...authHeader };
    }

    return config;
  },
  (error) => Promise.reject(error)
);

// 响应拦截器处理 401 错误
instance.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response?.status === 401) {
      clearTokenInfo();
      ElMessage.error("登录已过期，请重新登录");
      setTimeout(() => {
        window.location.href = "/login";
      }, 1000);
      // 401错误时直接阻断，不继续传递错误
      return Promise.reject(new Error("登录已过期，请重新登录"));
    }
    return Promise.reject(error);
  }
);

export default instance;
